package com.cloud.class04.test.reflex;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws Exception {
        // 创建英雄对象
        Hero hero = new Hero("安其拉", 1000, 200, 100);
        // 获取英雄类的Class对象
//        获取Hero类对象的三种方式：
//        Class<?> aClass1 = Class.forName("com.cloud.class04.test.reflex.Hero");
//        Class<? extends Class> aClass = Hero.class.getClass();
//

        Class<?> clazz = hero.getClass();
        // 获取英雄类的所有属性
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true); // 设置属性可访问
            String name = field.getName(); // 获取属性名
            Object value = field.get(hero); // 获取属性值
            System.out.println("直接获取私有属性值为："+name + ": " + value);
        }
        // 获取英雄类的所有方法
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            String name = method.getName(); // 获取方法名
            if (name.startsWith("get")) { // 只处理getter方法
                String propertyName = name.substring(3); // 去掉"get"前缀
                propertyName = Character.toLowerCase(propertyName.charAt(0)) + propertyName.substring(1); // 将首字母转为小写
                Object value = method.invoke(hero); // 调用方法获取属性值
                System.out.println("通过get方法获取私有属性值为："+propertyName + ": " + value);
            }
        }
    }
}
